WAFログのCountリクエストをAthenaで確認したい
困っていた内容
S3 に出力されている AWS WAF ログから、Count1 のリクエストを確認したいと考えています。
そのため、まず以下ドキュメントに記載のクエリを使用し、Amazon Athena で WAF ログのテーブルの作成を行いました。
WAF ログの中に Count のリクエストは存在することは間違いないのですが、作成したテーブルに対し、Count のリクエストを抽出するためのクエリを作成・実行したところ結果が 0 件となりました。
どう対応すればいいの?
該当する Count アクションが WAF ログのどのフィールドに記録されているか把握し、それに応じたクエリを実行する必要があります。
現在、WAF ログの Count の記録フィールドは以下の三箇所があります。
- WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
- "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
- "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録
※ それぞれのログ形式の詳細と、対応する WebACL の設定につきましては、以下ブログ記事をご確認ください。
この三つのログパターンのうち、1 および 3 を Athena で抽出するためのクエリについては、以下の AWS ブログで確認することができます。2
しかし、2 については、2022 年 10 月 27 日のアップデート3 により記録されるようになったフィールドであるため、2022 年 9 月に公開されている上記の AWS ブログでカバーされない内容となります。
以下では、上述の三つのログパターンで記録された COUNT を抽出するためのクエリの一例をそれぞれ紹介します。
1. WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録されている場合
SELECT from_unixtime(timestamp/1000, '+00:00') AS UTC, from_unixtime(timestamp/1000, '+09:00') AS JST, httprequest.clientip, httprequest.uri, httprequest.country, t.ruleid FROM "waf_logs" CROSS JOIN UNNEST(nonTerminatingMatchingRules) AS t(t) WHERE t.action='COUNT'
2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録されている場合
SELECT from_unixtime(timestamp/1000, '+00:00') AS UTC, from_unixtime(timestamp/1000, '+09:00') AS JST, httprequest.clientip, httprequest.uri, httprequest.country, t1.rulegroupid, t2.ruleId FROM "waf_logs" CROSS JOIN UNNEST(rulegrouplist) AS t(t1) CROSS JOIN UNNEST(t1.nonTerminatingMatchingRules) AS t(t2) WHERE t2.action='COUNT'
3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録されている場合
SELECT from_unixtime(timestamp/1000, '+00:00') AS UTC, from_unixtime(timestamp/1000, '+09:00') AS JST, httprequest.clientip, httprequest.uri, httprequest.country, t.rulegroupid, t.excludedrules FROM "waf_logs" CROSS JOIN UNNEST(rulegrouplist) AS t(t) WHERE t.excludedrules IS NOT NULL
参考資料
- Querying AWS WAF logs - Amazon Athena
- Rule action - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
- Action overrides in rule groups - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
- AWS WAF のログ分析に関する考慮事項 | Amazon Web Services ブログ
- Log fields - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
- Flattening nested arrays - Amazon Athena
注釈
-
Count は、WAF のルールやルールグループに設定できるアクションの一つです。特定のルールやルールグループのアクションを Block や Allow に決定する前に該当するリクエストについて調べる、対象のリクエストにラベルを追加する、などの用途で使用されます。
・Count – AWS WAF はリクエストをカウントしますが、リクエストを許可するかブロックするかは決定しません。これは非終了アクションです。AWS WAF がウェブ ACL の残りのルールの処理を継続します。定義したルールでは、リクエストにカスタムヘッダーを挿入し、他のルールで一致するラベルを追加できます。
出典: ルールアクション - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced
- 1 は「例: Athena で “action”:”COUNT” を抽出するためのクエリ」、3 は「例: Athena で “EXCLUDED_AS_COUNT” を抽出するためのクエリ」に掲載されているクエリが使用できます。本記事で紹介しているクエリ例も、これらを基にしています。 ↩
-
該当のアップデートは以下のものになります。
変更 説明 日付 ルールグループ内のアクションオーバーライド ルールグループ内のルールアクションを任意のルールアクション設定にオーバーライドできるようになりました。前の Count アクションオーバーライドと同様に、オーバーライドをルールグループ内のすべてのルールと個々のルールに適用できます。 2022 年 10 月 27 日
出典: ドキュメント履歴 - AWS WAF、AWS Firewall Manager、および AWS Shield Advanced